查看原文
其他

孟冉: Linux火焰图的数据流程分析

孟冉 Linux阅码场 2022-12-14


内容简介:

本文紧接着《宋宝华:火焰图:全局视野的Linux性能剖析》一文,继续分析火焰图的数据流程和绘制原理。


作者简介:

孟冉,目前就读于西安邮电大学,计算机科学与技术专业;目前研究linux系统的负载均衡技术和网络安全方面。孟冉目前在陈莉君老师的Linux 3+1实验室,并正在努力朝LEP(Linux Easy Profiling, http://www.linuxep.com)添加一键火焰图支持。

关注Linuxer,订阅源源不断的研发一线原创文章:

火焰图简介

火焰图是将当前系统的部分信息利用特殊图表的方式进行展示,可以将大量的数据汇聚到一张简明扼要的途中。火焰图可以直观的反映出当前系统性能占用情况,很适合应用于服务器性能的监控中。根据系统性能的指标可以将火焰图分为多种,常见的有on-cpu和off-cpu两种火焰图,下面是生成一个on-cpu火焰图的过程。

相关阅读:

宋宝华:火焰图:全局视野的Linux性能剖析

火焰图生成流程

以on-CPU火焰图为例,生成一张火焰图的大致过程如下:采集系统信息,处理信息,生成火焰图。

采集信息

采集信息有很多种方法,这里使用的是perf工具采集:

  • 采集指定进程信息

# perf record -F 99 –p 13204 -g -- sleep 60

-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 60则是持续60秒。

  • 采集所有进程信息

# perf record -F 99 –a -g -- sleep 60

  • 查看采集到的信息

# perf script

查看采集到的信息,下面是其中一段。其实就是一个栈回溯:

采样到的栈回溯信息是巨量的,显然需要进行加工处理。

处理信息

处理信息需要工具,可以从github上下载:

# git clone https://github.com/brendangregg/FlameGraph

利用里面的工具处理采集到的数据:

# cd FlameGraph

# perf script | ./stackcollapse-perf.pl > out.perf

下面我们详细解释一下perf script | ./stackcollapse-perf.pl > out.perf这个命令的含义。

如前一节所描述,当信息采集完后会得到到大量类似于前面已经显示的数据单元的数据:

有很多组数据单元是相同的,"perf script | ./stackcollapse-perf.pl > out.perf"命令中的 stackcollapse-perf.pl脚本会统计每个调用栈回溯出现的次数,并将这一单元(以行为单位从下到上)处理为一行。上面的调用栈经过处理后得到:

swapper; x86_64_start_reservations; start_kernel; rest_init; cpu_startup_entry; arch_cpu_idle; default_idle; native_safe_halt 1

这里的1表示采样数,如果采样到多个相同的调用栈,则每次增加1。


“perf script | ./stackcollapse-perf.pl > out.perf”生成的out.perf数据文件已经很方便阅读了,我们可以根据需要做定制修改,比如不需要火焰图中cpu_idle的信息:

# grep -v cpu_idle out.perf>out1.perf

不需要cpu_idle的火焰图信息,则可以过滤掉。当然也可以直接用vim处理。

生成火焰图

这里生成的火焰图是利用flamegraph.pl工具,有兴趣的可以自己做一个工具哦:

# ./flamegraph.pl out.perf > perf-kernel.svg   #将产生的数据生成火焰图。

综合上面的步骤,生成火焰图需要采样,生成数据文件(out.perf),将数据文件生成svg矢量图,火焰图就做好了(这台linux没有业务运行,所以火焰图很简单)。

数据文件(out.perf)分析

如果想自己做一个类似于flamegraph.pl的工具,就需要知道flamegraph.pl做了哪些事情,先来看一下out.perf的内容吧!

这个是数据文件(out.perf)的内容,这里的每一行对应火焰图的一列:

比如现在有一下数据文件:

a;b;c 1

a;b;d 2

a;e;f 1

flamegraph.pl脚本在绘制的过程如下:将一行绘制成一列,采样数越大列就越宽;在生成svg图里面,同一级的同样的函数名,合并在一起。所有的列按照样本数比例填满火焰图的总宽度(比如火焰总宽为1200px,在下图中A的宽度为1200px,C为300px)生成的svg火焰图如下:

如果采集的out.perf中的采样数刚好都是1,那么将out.perf中的文字缩小并旋转后就会产生下面的图片,刚好对应上面生成的火焰图。这还是很有意思的。

想要更深入的了解火焰图可以去官网查看:http://www.brendangregg.com/flamegraphs.html

on-cpu资料:http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html

off-cpu资料:http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html

苹果用户打赏

安卓用户打赏

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存